package 其他.无重复字符的最长子串3;

public class Solution {
    /**
     * 计算字符串中最长无重复字符的子串的长度
     * 通过维护一个滑动窗口，使用数组记录每个字符出现的次数，以确定子串中字符是否重复
     * 当遇到重复字符时，调整窗口的左边界，直到不再包含重复字符
     * 在此过程中，持续更新最长无重复子串的长度
     *
     * @param s 输入的字符串
     * @return 最长无重复字符子串的长度
     */
    public int lengthOfLongestSubstring(String s) {
        // 将字符串转换为字符数组，便于逐个字符处理
        char[] str = s.toCharArray();
        // 初始化最长无重复子串的长度为0
        int ans = 0;
        // 初始化滑动窗口的左边界为0
        int left = 0;
        // 初始化一个长度为128的数组，用于记录窗口内每个字符出现的次数
        int[] cnt = new int[128];
        // 遍历字符数组，调整滑动窗口的右边界
        for (int right = 0; right < str.length; right++) {
            // 获取当前考察的字符
            char c = str[right];
            // 在窗口内记录字符出现的次数
            cnt[c]++;
            // 如果当前字符出现次数超过1，说明窗口内有重复字符
            // 则移动窗口的左边界，直到窗口内不再包含重复字符
            while (cnt[c] > 1) {
                cnt[str[left]]--;
                left++;
            }
            // 每次调整窗口后，更新记录最长无重复子串的长度
            ans = Math.max(ans, right - left + 1);
        }
        // 返回最长无重复子串的长度
        return ans;
    }

}
